package com.rceeslca.modules.cam.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.rceeslca.common.exception.RceesLcaException;
import com.rceeslca.modules.cam.dao.CamCourseDao;
import com.rceeslca.modules.cam.dao.CamCourseItemDao;
import com.rceeslca.modules.cam.entity.CamCourse;
import com.rceeslca.modules.cam.entity.CamCourseItem;
import com.rceeslca.modules.cam.service.CamStudentService;
import com.rceeslca.modules.cam.vo.AttenCourseVo;
import com.rceeslca.modules.cam.vo.CamStudentCourseVo;
import com.rceeslca.modules.security.user.UserDetail;
import lombok.AllArgsConstructor;
import org.apache.shiro.SecurityUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.List;

/**
 * 学生
 */
@Service
@AllArgsConstructor
public class CamStudentServiceImpl implements CamStudentService {

    @Autowired
    private CamCourseDao courseDao;

    @Autowired
    private CamCourseItemDao courseItemDao;


    /**
     * 分页查询课程
     * @param page 分页
     * @param param 参数
     */
    @Override
    public IPage<CamStudentCourseVo> pageCourse(Page<CamStudentCourseVo> page, CamStudentCourseVo param) {
        //当前用户
        UserDetail user = (UserDetail) SecurityUtils.getSubject().getPrincipals().getPrimaryPrincipal();
        return courseItemDao.pageSelectStudentCourse(page,user.getId());
    }


    /**
     * 选课
     * @param param 参数
     */
    @Override
    public void chooseCourse(CamCourseItem param) {

        //课程存在
        CamCourse camCourse = courseDao.selectById(param.getCourseId());
        if(camCourse!=null){

            //课程满员
            QueryWrapper<CamCourseItem> ciWrapper = new QueryWrapper<>();
            ciWrapper.lambda().eq(CamCourseItem::getCourseId,param.getCourseId());
            List<CamCourseItem> courseItemList = courseItemDao.selectList(ciWrapper);
            if(courseItemList.size()<camCourse.getMaxSize()){
                //当前用户
                UserDetail user = (UserDetail) SecurityUtils.getSubject().getPrincipals().getPrimaryPrincipal();
                ciWrapper.lambda().eq(CamCourseItem::getStudentId,user.getId());
                courseItemList = courseItemDao.selectList(ciWrapper);
                //课程选择
                if(courseItemList.isEmpty()){
                    CamCourseItem courseItem = new CamCourseItem();
                    courseItem.setCourseId(param.getCourseId());
                    courseItem.setStudentId(user.getId());

                    courseItemDao.insert(courseItem);
                }else{
                    throw new RceesLcaException("课程已选择");
                }
            }else{
                throw new RceesLcaException("课程已满员");
            }

        }else{
            throw new RceesLcaException("课程不存在");
        }
    }


    /**
     * 退课
     * @param courseItem 课程项
     */
    @Override
    public void dropCourse(CamCourseItem courseItem) {

        CamCourseItem itemEntity = courseItemDao.selectById(courseItem.getId());
        if(itemEntity!=null){
            CamCourse courseEntity = courseDao.selectById(itemEntity.getCourseId());
            if(courseEntity!=null){
                if(courseEntity.getStatus()==0){
                    courseItemDao.deleteById(courseItem);
                }else{
                    throw new RceesLcaException("课程已开始");
                }
            }else{
                throw new RceesLcaException("课程不存在");
            }
        }else{
            throw new RceesLcaException("选课数据不存在");
        }
    }


    /**
     * 签到
     * @param param 参数
     */
    @Override
    public void signInCourse(AttenCourseVo param) {

        CamCourseItem itemEntity = courseItemDao.selectById(param.getCourseItemId());
        if(itemEntity!=null){
            CamCourse courseEntity = courseDao.selectById(itemEntity.getCourseId());
            if(courseEntity!=null){
                if(itemEntity.getOperation().equals("null")){
                    if(courseEntity.getStatus()==1){
                        itemEntity.setOperation("sign");
                        itemEntity.setOperationResult("success");
                        Date nowTime = new Date();
                        itemEntity.setOperationTime(nowTime);
                        itemEntity.setOperationFinishTime(nowTime);

                        courseItemDao.updateById(itemEntity);
                    }else if(courseEntity.getStatus()==0){
                        throw new RceesLcaException("考勤未开始");
                    }else{
                        throw new RceesLcaException("考勤已结束");
                    }
                }else if(itemEntity.getOperation().equals("sign")){
                    throw new RceesLcaException("已签到");
                }else if(itemEntity.getOperation().equals("leave")){
                    throw new RceesLcaException("已请假");
                }
            }else{
                throw new RceesLcaException("课程不存在");
            }
        }else{
            throw new RceesLcaException("选课数据不存在");
        }
    }


    /**
     * 请假
     * @param param 参数
     */
    @Override
    public void leaveCourse(AttenCourseVo param) {
        CamCourseItem itemEntity = courseItemDao.selectById(param.getCourseItemId());
        if(itemEntity!=null){
            CamCourse courseEntity = courseDao.selectById(itemEntity.getCourseId());
            if(courseEntity!=null){
                if(itemEntity.getOperation().equals("null")){
                    itemEntity.setOperation("leave");
                    itemEntity.setOperationContent(param.getOperationContent());
                    itemEntity.setOperationTime(new Date());

                    courseItemDao.updateById(itemEntity);
                }else if(itemEntity.getOperation().equals("sign")){
                    throw new RceesLcaException("已签到");
                }else if(itemEntity.getOperation().equals("leave")){
                    throw new RceesLcaException("已请假");
                }
            }else{
                throw new RceesLcaException("课程不存在");
            }
        }else{
            throw new RceesLcaException("选课数据不存在");
        }
    }

}
